package com.knowledge.plus.泛型.泛型类;

/**
 * 示例：泛型类 <单类型参数>
 *
 * @author TPF
 * @since 2023/7/14
 */
public class Generic<T> {

    /**
     * key 这个成员变量的数据类型为 T, T的类型由外部传入
     */
    private T key;

    /**
     * 泛型构造方法形参 key 的类型也为 T，T的类型由外部传入
     */
    public Generic(T key) {
        this.key = key;
    }

    /**
     * 泛型方法 getKey 的返回值类型为 T，T 的类型由外部指定
     */
    public T getKey() {
        return key;
    }

    /*
     * 泛型类中，静态方法和静态变量不可以使用泛型类所声明的类型参数
     * * 泛型类中的类型参数的确定是在创建泛型类对象的时候（例如 ArrayList< Integer >）
     * * 而静态变量和静态方法在类加载时已经初始化，直接使用类名调用；在泛型类的类型参数未确定时，静态成员有可能被调用。
     * 因此泛型类的类型参数是不能在静态成员中使用的。
     */
    // public static T one;   // 编译错误
    // public static T show(T one){ // 编译错误
    //     return null;
    // }

    /**
     * 在静态方法中使用：
     * 静态泛型方法中可以使用自身的方法签名中新定义的类型参数
     */
    public static <E> E show(E one) {    // 这是正确的，因为 E 是在静态方法签名中新定义的类型参数
        return null;
    }
}
